bitwise
JavaScript/TypeScript library to manipulate bits, nibbles, bytes, and buffers.
Example
import bitwise from 'bitwise'
const bits = bitwise.byte.read(42)
bitwise.bits.toString(bits, 4)
bitwise.byte.write(bits)
bitwise.bits.and([0, 0, 1, 1], [0, 1, 0, 1])
bitwise.bits.xor([0, 0, 1, 1], [0, 1, 0, 1])
import byte from 'bitwise/byte'
byte.read(42)
Installation
bun add bitwise
or
yarn add bitwise
or
npm install --save bitwise
Table of Contents
- bits
- operations (and, circularShiftLeft, circularShiftRight, nand, nor, not, or, xnor, xor)
- reduce operations (reduceAnd, reduceNand, reduceNor, reduceOr, reduceXnor, reduceXor)
- toString
- buffer
- byte
- integer
- nibble
- string
bits
import and from 'bitwise/bits/and'
import bits from 'bitwise/bits'
import toString from 'bitwise/bits/to-string'
bits.and
(bits1: Array<0|1>, bits2: Array<0|1>): Array<0|1>
Applies the bitwise AND
operation, expects two arrays of the same size and returns a new one.
bitwise.bits.and([1, 0, 0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 0])
bits.circularShiftLeft
(bits: Array<0|1>, amount: number): Array<0|1>
Applies the bitwise ROL
operation, expects two arrays of the same size and a shift amount and returns a new one.
bitwise.bits.circularShiftLeft([0, 0, 0, 1, 1, 1, 1, 1], 1)
bits.circularShiftRight
(bits: Array<0|1>, amount: number): Array<0|1>
Applies the bitwise ROR
operation, expects two arrays of the same size and a shift amount and returns a new one.
bitwise.bits.circularShiftRight([0, 0, 0, 1, 1, 1, 1, 1], 1)
bits.nand
(bits1: Array<0|1>, bits2: Array<0|1>): Array<0|1>
Applies the bitwise NAND
operation, expects two arrays of the same size and returns a new one.
bitwise.bits.nand([1, 0, 0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 0])
bits.nor
(bits1: Array<0|1>, bits2: Array<0|1>): Array<0|1>
Applies the bitwise NOR
operation, expects two arrays of the same size and returns a new one.
bitwise.bits.nor([1, 0, 0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 0])
bits.not
(bits: Array<0|1>): Array<0|1>
Flips all given bits and returns the flipped bits.
bitwise.bits.not([1, 0, 1, 1, 0, 1])
bits.or
(bits1: Array<0|1>, bits2: Array<0|1>): Array<0|1>
Applies the bitwise OR
operation, expects two arrays of the same size and returns a new one.
bitwise.bits.or([1, 0, 0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 0])
bits.xnor
(bits1: Array<0|1>, bits2: Array<0|1>): Array<0|1>
Applies the bitwise exclusive NOR
operation, expects two arrays of the same size and returns a new one.
bitwise.bits.xnor([1, 0, 0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 0])
bits.xor
(bits1: Array<0|1>, bits2: Array<0|1>): Array<0|1>
Applies the bitwise exclusive OR
operation, expects two arrays of the same size and returns a new one.
bitwise.bits.xor([1, 0, 0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 0])
bits.reduceAnd
(bits: Array<0|1>): 0|1
Applies the bitwise AND
operation on the given bits. Returns one bit. Throws if less than 2 bits are given.
bitwise.bits.reduceAnd([1, 0, 0, 0, 1, 1, 0, 1])
bits.reduceNand
(bits: Array<0|1>): 0|1
Applies the NAND
operation on the given bits. Returns one bit. Throws if less than 2 bits are given.
bitwise.bits.reduceNand([1, 0, 0, 0, 1, 1, 0, 1])
bits.reduceNor
(bits: Array<0|1>): 0|1
Applies the NOR
operation on the given bits. Returns one bit. Throws if less than 2 bits are given.
bitwise.bits.reduceNor([1, 0, 0, 0, 1, 1, 0, 1])
bits.reduceOr
(bits: Array<0|1>): 0|1
Applies the OR
operation on the given bits. Returns one bit.
Throws if less than 2 bits are given.
bitwise.bits.reduceOr([1, 0, 0, 0, 1, 1, 0, 1])
bits.reduceXnor
(bits: Array<0|1>): 0|1
Applies the XNOR
operation on the given bits. Returns one bit. Throws if less than 2 bits are given.
bitwise.bits.reduceXnor([1, 0, 0, 0, 1, 1, 0, 1])
bits.reduceXor
(bits: Array<0|1>): 0|1
Applies the XOR
operation on the given bits. Returns one bit.
Throws if less than 2 bits are given.
bitwise.bits.reduceXor([1, 0, 0, 0, 1, 1, 0, 1])
bits.toBoolean
(bits: Array<0|1>): Array<boolean>
Converts a bit array to a boolean array.
bitwise.bits.toBoolean([0, 1])
bits.toString
(bits: Array<0|1>, spacing: number = 0, spacer: string = ' '): string
Converts a bit Array
to a String
. If defined, inserts spacer
every spacing
characters, but never inserts it as the last substring.
bitwise.bits.toString([1, 0, 1, 0, 1, 0], 2, '_')
buffer
import and from 'bitwise/buffer/and'
import buffer from 'bitwise/buffer'
import create from 'bitwise/buffer/create'
buffer.create
(bits: Array<0|1>): Buffer
Creates a new buffer and writes the given bits.
const buffer = bitwise.buffer.create([1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0])
buffer.modify
(buffer: Buffer, newBits: Array<0|1>, bitOffset: number = 0): void
Modifies the buffer's bits to equal newBits
starting at bitOffset
.
const buffer = Buffer.from('A43A', 'hex')
bitwise.buffer.modify(buffer, [0, 0, 0, 1, 0, 0, 1], 3)
buffer.and
(buffer1: Buffer, buffer2: Buffer, isLooping = false): Buffer
Applies a bitwise AND
with buffer2
to every value in buffer1
. Returns a new buffer. If isLooping
is set, buffer1
may be read multiple times in case it's shorter than buffer2
.
bitwise.buffer.and(buffer1, buffer2, false)
buffer.nand
(buffer1: Buffer, buffer2: Buffer, isLooping = false): Buffer
Applies a bitwise NAND
with buffer2
to every value in buffer1
. Returns a new buffer. If isLooping
is set, buffer1
may be read multiple times in case it's shorter than buffer2
.
bitwise.buffer.nand(buffer1, buffer2, false)
buffer.nor
(buffer1: Buffer, buffer2: Buffer, isLooping = false): Buffer
Applies a bitwise NOR
with buffer2
to every value in buffer1
. Returns a new buffer. If isLooping
is set, buffer1
may be read multiple times in case it's shorter than buffer2
.
bitwise.buffer.nor(buffer1, buffer2, false)
buffer.not
(buffer: Buffer): Buffer
Flips all bits in the given buffer.
bitwise.buffer.not(buffer, false)
buffer.or
(buffer1: Buffer, buffer2: Buffer, isLooping = false): Buffer
Applies a bitwise OR
with buffer2
to every value in buffer1
. Returns a new buffer. If isLooping
is set, buffer1
may be read multiple times in case it's shorter than buffer2
.
bitwise.buffer.or(buffer1, buffer2, false)
buffer.xnor
(buffer1: Buffer, buffer2: Buffer, isLooping = false): Buffer
Applies a bitwise XNOR
with buffer2
to every value in buffer1
. Returns a new buffer. If isLooping
is set, buffer1
may be read multiple times in case it's shorter than buffer2
.
bitwise.buffer.xnor(buffer1, buffer2, false)
buffer.xor
(buffer1: Buffer, buffer2: Buffer, isLooping = false): Buffer
Applies a bitwise XOR
with buffer2
to every value in buffer1
. Returns a new buffer. If isLooping
is set, buffer1
may be read multiple times in case it's shorter than buffer2
.
bitwise.buffer.xor(buffer1, buffer2, false)
buffer.read
(buffer: Buffer, bitOffset: number = 0, bitLength?: number): Array<0|1>
Returns an Array containing bitLength
bits starting at bitOffset
. If no bitLength
is given, it's assumed to be the rest of the buffer.
const buffer = Buffer.from('ED743E17', 'hex')
bitwise.buffer.read(buffer, 12)
buffer.readInt
(buffer: Buffer, bitOffset: number = 0, bitLength: number = 8): number
Converts a section of a buffer to a signed integer.
bitwise.buffer.readInt(buffer, 3, 5)
buffer.readUInt
(buffer: Buffer, bitOffset: number = 0, bitLength: number = 8): number
Converts a section of a buffer to an unsigned integer.
bitwise.buffer.readUInt(buffer, 3, 5)
byte
import byte from 'bitwise/byte'
import read from 'bitwise/byte/read'
byte.read
(byte: UInt8): Array<0|1>
Returns an Array of length 8 containing the read bits.
bitwise.byte.read(42)
bitwise.byte.read(256)
byte.write
(bits: Array<0|1>): UInt8
Returns a Byte (0-255) which represents the given bits.
bitwise.byte.write([0, 0, 1, 0, 1, 0, 1, 0])
bitwise.byte.write([0, 0, 1, 0, 1, 0, 1, 0, 0])
integer
import integer from 'bitwise/integer'
integer.getBit
(number: number, position: number): 0|1
Gets the value of a specific bit.
bitwise.integer.getBit(128, 7)
integer.setBit
(number: number, position: number, value: 0|1): Array<0|1>
Sets the value of a specific bit.
bitwise.integer.setBit(128, 7, 0)
integer.toggleBit
(number: number, position: number): Array<0|1>
Toggles the value of a specific bit.
bitwise.integer.toggleBit(128, 7)
nibble
import nibble from 'bitwise/nibble'
import read from 'bitwise/nibble/read'
nibble.read
(nibble: UInt4): Array<0|1>
Returns an Array of length 4 containing the read bits.
bitwise.nibble.read(15)
bitwise.nibble.read(42)
nibble.write
(nibble: [<0|1>, <0|1>, <0|1>, <0|1>]): UInt4
Returns a Nibble (0-15
) which represents the given bits.
bitwise.nibble.write([0, 0, 1, 0])
bitwise.nibble.write([0, 0, 1, 0, 1])
string
import string from 'bitwise/string'
import toBits from 'bitwise/string/to-bits'
string.toBits
(string: string): Array<0|1>
Converts a string into an array of bits. Ignores all characters except 1
and 0
.
bitwise.string.toBits('10 10 12$%_.0')
Development
bitwise
uses bun
instead of node
bun install
bun test
bun run build
History
2.2.1
- remove
typescript
from dependencies
in favor of devDependencies
- (internal) update and apply prettier
2.2.0
- add npm provenance support to package
- (internal) add auto-publish from pipelines
- (internal) Switch to
bun
2.1.0
- Add
bits.circularShiftLeft
(#44 / #49) via @0xflotus - Add
bits.circularShiftRight
(#44 / #49) via @0xflotus
2.0.2–2.0.3
- Add Support for Tree Shaking
2.0.1
- Readme/package.json updates
2.0.0
- refactor to typescript
- remove
bitwise.buffer.readCInt()
1.4.0
- improve
require()
support
1.3.0
1.2.0
- add
bits.reduceAnd
- add
bits.reduceNand
- add
bits.reduceNor
- add
bits.reduceOr
- add
bits.reduceXnor
- add
bits.reduceXor
1.1.2
- split up
buffer.operations
1.1.1
1.1.0
- add
integer.getBit
- add
integer.setBit
- add
integer.toggleBit
1.0.0
- rewrite in ES6
- improve utilization of bitwise operators
- improve API (breaking change)
0.2.0
- Added buffer bitwise operations
0.1.2
- Added nor, xnor, nand
- Fixed bitwise operations modifying original array
0.1.0
- Re-ordered the arguments in readInt, readCInt, readUInt
- Added not, and, or, xor
- Renamed flipBits to not